﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Validation;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;

namespace Domain
{
    [HasSelfValidation]
    public class PublicacionAsociada : DomainObject
    {
        public DateTime FechaAsociacion { get; set; }
        public DateTime? FechaBajaAsociacion { get; set; }
        public Publicacion Asociacion { get; set; }
        public List<Consumo> Uso { get; set; }

        public PublicacionAsociada() { }

    }

    /// <summary>
    /// Clase que indica una publicacion de interes por parte de una empresa
    /// </summary>
    [HasSelfValidation]
    public class Publicacion : DomainObject
    {
        public enum enum_Publicacion_Estado {
            Publicada = 0,
            Caducada = 1,
            Baja = 2,
            Anulada = 3
        }

        public long Id { get; set; }
        public long? Logo { get; set; }

        [StringLengthValidator(5, 50, MessageTemplate = "Debe especificar una descripción de entre 5 y 50 cáracteres")]
        public string Descripcion { get; set; }

        public DateTime FechaCreacion { get; set; }
        public DateTime? FechaCaducidad { get; set; }
        public DateTime? FechaBaja { get; set; }
        public DateTime? FechaAnulacion { get; set; }
        public List<PublicacionFeed> Revisiones { get; set; }
        public PublicacionFeed UltimaRevision
        {
            get
            {
                if (this.Revisiones == null || this.Revisiones.Count == 0)
                    return null;

                return (from r in Revisiones
                        orderby r.Fecha descending
                        select r).First<PublicacionFeed>();

            }
        }
        public enum_Publicacion_Estado Estado
        {
            get { 
                enum_Publicacion_Estado curr_sta = enum_Publicacion_Estado.Publicada;
                if (FechaCaducidad.HasValue && FechaCaducidad.Value.Date <= DateTime.Today.Date)
                {
                    curr_sta = enum_Publicacion_Estado.Caducada;
                }
                if (FechaBaja.HasValue && FechaBaja.Value.Date <= DateTime.Today.Date)
                {
                    curr_sta = enum_Publicacion_Estado.Baja;
                }
                if (FechaAnulacion.HasValue && FechaAnulacion.Value.Date <= DateTime.Today.Date)
                {
                    curr_sta = enum_Publicacion_Estado.Anulada;
                }
                return curr_sta;
            }
        }

        public Publicacion(){}
        public Publicacion(long _Id, long? _Logo, string _Descripcion,
                           DateTime _FechaCreacion, DateTime? _FechaCaducidad,
                           DateTime? _FechaBaja, DateTime? _FechaAnulacion, List<PublicacionFeed> _Revisiones)
        {

            this.Id = _Id;
            this.Logo = _Logo;
            this.Descripcion = _Descripcion;
            this.FechaCreacion = _FechaCreacion;
            this.FechaCaducidad = _FechaCaducidad;
            this.FechaBaja = _FechaBaja;
            this.FechaAnulacion = _FechaAnulacion;
            this.Revisiones = _Revisiones;
        }

        [SelfValidation]
        public void Check_Fechas(ValidationResults results)
        {

            if (FechaCaducidad.HasValue && (FechaCaducidad.Value < FechaCreacion))
            {
                results.AddResult(new ValidationResult("La fecha de caducidad no puede ser menor a la de publicación", this, "", "", null));
            }

            if (FechaBaja.HasValue && (FechaBaja.Value < FechaCreacion))
            {
                results.AddResult(new ValidationResult("La fecha de baja no puede ser menor a la de publicación", this, "", "", null));
            }
        }

        [SelfValidation]
        public void Check_Revisiones(ValidationResults results)
        {
            if (Revisiones == null || Revisiones.Count == 0)
            {
                results.AddResult(new ValidationResult("Una publicación debe poseer al menos una Revisión", this, "", "", null));
            }
        }
    }

    /// <summary>
    /// Revision de una Publicacion
    /// </summary>
    [HasSelfValidation]
    public class PublicacionFeed : DomainObject
    {
        public string Datos { get; set; }
        public DateTime Fecha { get; set; }

        public PublicacionFeed(){}
        public PublicacionFeed(
        string _Datos , DateTime _Fecha ){
            this.Datos = _Datos;
            this.Fecha = _Fecha;
        }

        [SelfValidation]
        public void Check_Revisiones(ValidationResults results)
        {
            if (string.IsNullOrEmpty(Datos))
            {
                results.AddResult(new ValidationResult("Una revisión debe poseer datos", this, "", "", null));
            }
        }
    }
}
